Pre/Post Insert, Update, এবং Delete Interceptors গাইড ও নোট

Java Technologies - হাইবারনেট (Hibernate) - Hibernate Interceptors এবং Listeners
296

Hibernate এ interceptors এমন একটি মেকানিজম যা entity-এর insert, update, এবং delete অপারেশনগুলির আগে এবং পরে কাস্টম লজিক প্রয়োগ করতে সাহায্য করে। এই কাস্টম লজিকটি আপনি pre-insert, post-insert, pre-update, post-update, pre-delete, এবং post-delete মেথডের মাধ্যমে ব্যবহার করতে পারেন।

Hibernate-এ interceptor ব্যবহারের মাধ্যমে আপনি audit logs, entity validation, বা additional business logic সম্পাদন করতে পারেন যখন কোনো entity ডেটাবেসে insert, update, বা delete হয়।

Pre/Post Insert, Update, এবং Delete Interceptors এর ধারণা

  • Pre-insert: কোনো entity insert করার আগে যে লজিকটি কার্যকরী হবে।
  • Post-insert: entity insert করার পর যে লজিকটি কার্যকরী হবে।
  • Pre-update: কোনো entity update করার আগে যে লজিকটি কার্যকরী হবে।
  • Post-update: entity update করার পর যে লজিকটি কার্যকরী হবে।
  • Pre-delete: কোনো entity delete করার আগে যে লজিকটি কার্যকরী হবে।
  • Post-delete: entity delete করার পর যে লজিকটি কার্যকরী হবে।

Hibernate Interceptor Interface

Hibernate-এর Interceptor ইন্টারফেসটি ডেটাবেস অপারেশনগুলির আগে বা পরে কাস্টম প্রক্রিয়া চালানোর জন্য ব্যবহৃত হয়। Hibernate এর org.hibernate.Interceptor ইন্টারফেসে কয়েকটি মেথড রয়েছে যা entity-এর বিভিন্ন অবস্থায় হুক করা যায়।

এই ইন্টারফেসের মেথডগুলি হল:

  1. onSave: Insert অপারেশন আগে
  2. onFlushDirty: Update অপারেশন আগে
  3. onDelete: Delete অপারেশন আগে
  4. postFlush: Post-Flush (সেশন ক্লিয়ার করার পর)

Step-by-Step: Pre/Post Insert, Update, Delete Interceptors in Hibernate

এখানে একটি AuditInterceptor ক্লাস তৈরি করব যা entity insert, update, এবং delete করার আগে এবং পরে কিছু কাস্টম প্রক্রিয়া প্রয়োগ করবে।

Step 1: Interceptor ক্লাস তৈরি করা

import org.hibernate.*;
import org.hibernate.type.Type;

import java.io.Serializable;

public class AuditInterceptor implements Interceptor {

    @Override
    public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException {
        // Pre-insert logic
        if (entity instanceof Employee) {
            System.out.println("Pre-insert: Employee is being inserted");
            // You can add logic like setting created timestamp, audit data, etc.
        }
        return false; // Returning false allows Hibernate to proceed with the save operation.
    }

    @Override
    public void onPostInsert(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
        // Post-insert logic
        if (entity instanceof Employee) {
            System.out.println("Post-insert: Employee has been inserted");
        }
    }

    @Override
    public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) throws CallbackException {
        // Pre-update logic
        if (entity instanceof Employee) {
            System.out.println("Pre-update: Employee is being updated");
        }
        return false; // Returning false allows Hibernate to proceed with the update operation.
    }

    @Override
    public void onPostUpdate(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
        // Post-update logic
        if (entity instanceof Employee) {
            System.out.println("Post-update: Employee has been updated");
        }
    }

    @Override
    public boolean onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException {
        // Pre-delete logic
        if (entity instanceof Employee) {
            System.out.println("Pre-delete: Employee is being deleted");
        }
        return false; // Returning false allows Hibernate to proceed with the delete operation.
    }

    @Override
    public void onPostDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
        // Post-delete logic
        if (entity instanceof Employee) {
            System.out.println("Post-delete: Employee has been deleted");
        }
    }

    @Override
    public void afterTransactionCompletion(Transaction tx) {
        // After transaction completion logic
    }

    @Override
    public void afterTransactionBegin(Transaction tx) {
        // Logic after transaction begins
    }

    @Override
    public void beforeTransactionCompletion(Transaction tx) {
        // Logic before transaction completion
    }

    @Override
    public boolean isTransactionInProgress() {
        return false;
    }

    // Other unused methods can be overridden as needed
}

এখানে:

  • onSave: এটি entity insert করার আগে কল করা হয়, যেখানে pre-insert লজিক স্থাপন করা হয়।
  • onPostInsert: এটি insert সম্পন্ন হওয়ার পরে কল করা হয়, যেখানে post-insert লজিক স্থাপন করা হয়।
  • onFlushDirty: এটি entity update করার আগে কল করা হয়, যেখানে pre-update লজিক স্থাপন করা হয়।
  • onPostUpdate: এটি update সম্পন্ন হওয়ার পরে কল করা হয়, যেখানে post-update লজিক স্থাপন করা হয়।
  • onDelete: এটি entity delete করার আগে কল করা হয়, যেখানে pre-delete লজিক স্থাপন করা হয়।
  • onPostDelete: এটি delete সম্পন্ন হওয়ার পরে কল করা হয়, যেখানে post-delete লজিক স্থাপন করা হয়।

Step 2: Interceptor ব্যবহার করা

এখন আমাদের AuditInterceptor ব্যবহার করতে হবে যখন Hibernate সেশন তৈরি করি। নিচে একটি উদাহরণ দেখানো হয়েছে:

import org.hibernate.*;
import org.hibernate.cfg.Configuration;

public class HibernateInterceptorExample {
    public static void main(String[] args) {
        
        // Configure SessionFactory and enable interceptor
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
                .addAnnotatedClass(Employee.class)
                .setInterceptor(new AuditInterceptor())  // Set the custom interceptor
                .buildSessionFactory();

        // Create session
        Session session = factory.getCurrentSession();

        try {
            // Create a new Employee object
            Employee employee = new Employee("John Doe", 50000);
            
            // Start a transaction
            session.beginTransaction();

            // Save the Employee object (will trigger onSave and onPostInsert)
            session.save(employee);
            
            // Commit the transaction
            session.getTransaction().commit();
            
            // Update the Employee object (will trigger onFlushDirty and onPostUpdate)
            session = factory.getCurrentSession();
            session.beginTransaction();
            employee.setSalary(60000);
            session.update(employee);
            session.getTransaction().commit();
            
            // Delete the Employee object (will trigger onDelete and onPostDelete)
            session = factory.getCurrentSession();
            session.beginTransaction();
            session.delete(employee);
            session.getTransaction().commit();

        } finally {
            factory.close();
        }
    }
}

এখানে:

  • Interceptor (AuditInterceptor) Hibernate সেশনের সাথে যোগ করা হয়েছে এবং এর মাধ্যমে entity insert, update, এবং delete অপারেশনগুলির আগে ও পরে কাস্টম লজিক কার্যকর হচ্ছে।
  • Employee অবজেক্টের save(), update(), এবং delete() মেথডগুলির মাধ্যমে বিভিন্ন CRUD অপারেশন চালানো হয় এবং এই অপারেশনগুলির আগে এবং পরে interceptor কাস্টম লজিক চালাচ্ছে।

Interceptor এর সুবিধা

ফিচারবিবরণ
Custom LogicInsert, update, delete অপারেশনগুলির আগে এবং পরে কাস্টম লজিক কার্যকর করা যায়।
Audit LogEntity অপারেশনগুলির ইতিহাস রেকর্ড করা যেতে পারে।
Entity ValidationEntity আপডেট বা ডিলিট করার আগে কাস্টম ভ্যালিডেশন করা যায়।
Data Integrityডেটাবেসের উপর অতিরিক্ত নিয়ন্ত্রণ স্থাপন করা যায়, যেমন entity-এর অবস্থা চেক করা।

Hibernate এর Pre/Post Insert, Update, এবং Delete Interceptors আপনাকে entity ডেটাবেস অপারেশনগুলির আগে এবং পরে কাস্টম প্রক্রিয়া চালানোর সুযোগ দেয়। এই ধরনের interceptors ব্যবহার করে আপনি audit logs, entity validation, business logic, বা data integrity checks চালাতে পারেন। Hibernate-এ interceptors ব্যবহারে কোড আরও নমনীয় এবং কার্যকরী হয়।

Content added By
Promotion

Are you sure to start over?

Loading...